package com.yyedu.examol.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 对密码加密和验证的工具类
 * @author Administrator
 *
 */
public class CipherUtil {
	/**
	 * 加密传入的字符串
	 * @param inputStr
	 * @return
	 */
	public static String generatePassword(String inputStr){
		try {
			return encodeByMD5(inputStr);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}		
	}
	/**
	 * 验证输入的密码是否正确
	 * @param password 加密后的密码
	 * @param inputStr 用户输入的字符串
	 * @return 验证结果
	 */
	public static boolean validatePassword(String password, String inputStr){
		try {
			return password.equals(encodeByMD5(inputStr));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return false;
		}
	}
	
	
	
	/** 16进制下数字到字符的映射数组 */
	private final static String[] hexDigits ={
		"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
		"a", "b", "c", "d", "e", "f"
	};
	
	/**
	 * MD5加密																							<br/>
	 * java.security.MessageDigest类用于为应用程序提供信息摘要算法的功能，如 MD5 或 SHA 算法。								<br/>
	 * 简单点说就是用于生成散列码。信息摘要是安全的单向哈希函数，它接收任意大小的数据，输出固定长度的哈希值。关于信息摘要和散列码请参照《数字证书简介》	<br/>
	 * MessageDigest 通过其getInstance系列静态函数来进行实例化和初始化。MessageDigest对象通过使用 update 方法处理数据。		<br/>
	 * 任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了，应该调用 digest 方法之一完成哈希计算并返回结果。			<br/>
	 * 对于给定数量的更新数据，digest 方法只能被调用一次。digest 方法被调用后，MessageDigest对象被重新设置成其初始状态。				<br/>
	 * @param originStr 加密前的字符串
	 * @return 加密后的字符串
	 * @throws NoSuchAlgorithmException 
	 */
	private static String encodeByMD5(String originStr) throws NoSuchAlgorithmException{
		if(originStr != null){
			//创建具有指定算法名称的信息摘要
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			//使用指定的字节数组对摘要进行最后更新，然后完成摘要计算
			byte[] results = md5.digest(originStr.getBytes());
			//将得到的字节数组转换为字符串返回
			String resultStr = byteArrayToHexString(results);
			return resultStr.toLowerCase();
		}
		return null;
	}
	
	/**  
     * 转换字节数组为十六进制字符串 
     * @param     字节数组 
     * @return    十六进制字符串 
     */  
    private static String byteArrayToHexString(byte[] b){  
        StringBuffer resultSb = new StringBuffer();  
        for (int i = 0; i < b.length; i++){  
            resultSb.append(byteToHexString(b[i]));  
        }  
        return resultSb.toString();  
    }  
      
    /** 将一个字节转化成十六进制形式的字符串     */  
    private static String byteToHexString(byte b){  
        int n = b;  
        if (n < 0)  
            n = 256 + n;  
        int d1 = n / 16;  
        int d2 = n % 16;  
        return hexDigits[d1] + hexDigits[d2];  
    }  
    
    
    
    
    public static void main(String[] args) {  
        String pwd1="abc";  
        String pwd2=""; 
        System.out.println("未加密的密码:"+pwd1);  
        //将abc加密  
        pwd2 = CipherUtil.generatePassword(pwd1);  
        System.out.println("加密后的密码:"+pwd2);  
          
        System.out.print("验证密码是否下确:");  
        if(CipherUtil.validatePassword(pwd2, pwd1)) {  
            System.out.println("正确");  
        }  
        else {  
            System.out.println("错误");  
        }  
    }  
}















